package fiuba.algo3.XMLProcessor.nucleo;

import java.util.ArrayList;
import java.util.List;

public class Nodo implements NodoXML
{
	private String nombre;
	private List<NodoAtributo> listaDeAtributos;
	private List<NodoXML> listaDeHijos;

	public Nodo(String nombre)
	{
		this.nombre = nombre;
		listaDeAtributos = new ArrayList();
		listaDeHijos = new ArrayList();
	}

	public String nombre()
	{
		return this.nombre;
	}

	public void nombre(String nombre)
	{
		this.nombre = nombre;
	}

	public String valor()
	{
		// Ignorar
		return "";
	}

	public void valor(String valor)
	{
		// Ignorar
	}

	private NodoAtributo obtenerAtributo(String nombre)
	{
		for (NodoAtributo atributo: listaDeAtributos)
		{
			if (nombre.equals(atributo.nombre()))
				return atributo;
		}
		return null;
	}

	public String obtenerValorAtributo(String nombre)
	{
		NodoAtributo atributo = obtenerAtributo(nombre);
		if (atributo != null)
			return atributo.valor();
		return "";
	}

	public List<NodoAtributo> obtenerAtributos()
	{
		return this.listaDeAtributos;
	}

	public List<NodoXML> obtenerHijos()
	{
		return this.listaDeHijos;
	}

	public void agregarAtributo(NodoAtributo atributo)
	{
		removerAtributo(atributo.nombre());
		listaDeAtributos.add(atributo);
	}

	public void agregarAtributo(String nombre, String valor)
	{
		removerAtributo(nombre);
		listaDeAtributos.add(new NodoAtributo(nombre, valor));
	}

	public void agregarAtributo(List<NodoAtributo> listaAtributos)
	{
		for (NodoAtributo nodoAtributo: listaAtributos)
			agregarAtributo(nodoAtributo);
	}

	public void agregarNodo(List<NodoXML> listaNodos)
	{
		for (NodoXML nodo: listaNodos)
			agregarNodo(nodo);
	}

	public void agregarNodo(NodoXML nodo)
	{
		removerNodo(nodo);
		this.listaDeHijos.add(nodo);
	}

	public void removerAtributo(String nombre)
	{
		for (int i = 0; i < this.listaDeAtributos.size(); i++)
		{
			if (this.listaDeAtributos.get(i).nombre().equals(nombre))
			{
				this.listaDeAtributos.remove(i);
			}
		}
	}

	public void removerNodo(NodoXML nodo)
	{
		this.listaDeHijos.remove(nodo);
	}

	public NodoXML obtenerPrimogenito()
	{
		return this.listaDeHijos.get(0);
	}

}
